From c4fd786866a2d8e757499f3f2d35f221d416de04 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 28 Jun 2019 13:28:46 +0000 Subject: [PATCH] Add a test for the grid layout manager Test some obvious conditions. This is mainly to test the waters for more intesting tests with other layout managers later. --- testsuite/gtk/grid-layout.c | 312 ++++++++++++++++++++++++++++++++++++ testsuite/gtk/meson.build | 1 + 2 files changed, 313 insertions(+) create mode 100644 testsuite/gtk/grid-layout.c diff --git a/testsuite/gtk/grid-layout.c b/testsuite/gtk/grid-layout.c new file mode 100644 index 0000000000..134766bef1 --- /dev/null +++ b/testsuite/gtk/grid-layout.c @@ -0,0 +1,312 @@ +/* Copyright (C) 2019 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#include + +#define GTK_TYPE_GIZMO (gtk_gizmo_get_type ()) +#define GTK_GIZMO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_GIZMO, GtkGizmo)) +#define GTK_GIZMO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_GIZMO, GtkGizmoClass)) +#define GTK_IS_GIZMO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_GIZMO)) +#define GTK_IS_GIZMO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_GIZMO)) +#define GTK_GIZMO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_GIZMO, GtkGizmoClass)) + +typedef struct _GtkGizmo GtkGizmo; + +struct _GtkGizmo { + GtkWidget parent; + + const char *name; + int min_width; + int min_height; + int nat_width; + int nat_height; + int width; + int height; +}; + +typedef GtkWidgetClass GtkGizmoClass; + +G_DEFINE_TYPE (GtkGizmo, gtk_gizmo, GTK_TYPE_WIDGET); + +static void +gtk_gizmo_measure (GtkWidget *widget, + GtkOrientation orientation, + int for_size, + int *minimum, + int *natural, + int *minimum_baseline, + int *natural_baseline) +{ + GtkGizmo *self = GTK_GIZMO (widget); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + *minimum = self->min_width; + *natural = self->nat_width; + } + else + { + *minimum = self->min_height; + *natural = self->nat_height; + } +} + +static void +gtk_gizmo_size_allocate (GtkWidget *widget, + int width, + int height, + int baseline) +{ + GtkGizmo *self = GTK_GIZMO (widget); + + self->width = width; + self->height = height; +} + +static void +gtk_gizmo_class_init (GtkGizmoClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + widget_class->measure = gtk_gizmo_measure; + widget_class->size_allocate = gtk_gizmo_size_allocate; +} + +static void +gtk_gizmo_init (GtkGizmo *self) +{ +} + +/* Create a grid with three children in row + * + * +--------+--------+--------+ + * | child1 | child2 | child3 | + * +--------+--------+--------+ + * + * Verify that + * - the layout has the expected min and nat sizes + * - the children get their nat width when the layout does + * - they all get the same height + */ +static void +test_simple_row (void) +{ + GtkWidget *window; + GtkWidget *parent; + GtkLayoutManager *layout; + GtkGizmo *child1; + GtkGizmo *child2; + GtkGizmo *child3; + GtkLayoutChild *lc; + int minimum, natural; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + parent = g_object_new (GTK_TYPE_GIZMO, NULL); + gtk_container_add (GTK_CONTAINER (window), parent); + + layout = gtk_grid_layout_new (); + gtk_widget_set_layout_manager (parent, layout); + + child1 = g_object_new (GTK_TYPE_GIZMO, NULL); + child2 = g_object_new (GTK_TYPE_GIZMO, NULL); + child3 = g_object_new (GTK_TYPE_GIZMO, NULL); + + child1->name = "child1"; + child1->min_width = 10; + child1->min_height = 10; + child1->nat_width = 20; + child1->nat_height = 20; + child2->name = "child2"; + child2->min_width = 20; + child2->min_height = 20; + child2->nat_width = 30; + child2->nat_height = 30; + child3->name = "child3"; + child3->min_width = 30; + child3->min_height = 30; + child3->nat_width = 40; + child3->nat_height = 40; + + gtk_widget_set_parent (GTK_WIDGET (child1), parent); + gtk_widget_set_parent (GTK_WIDGET (child2), parent); + gtk_widget_set_parent (GTK_WIDGET (child3), parent); + + lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child1)); + gtk_grid_layout_child_set_left_attach (GTK_GRID_LAYOUT_CHILD (lc), 0); + lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child2)); + gtk_grid_layout_child_set_left_attach (GTK_GRID_LAYOUT_CHILD (lc), 1); + lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child3)); + gtk_grid_layout_child_set_left_attach (GTK_GRID_LAYOUT_CHILD (lc), 2); + +#if 0 + gtk_widget_show (window); + + g_timeout_add (1000, (GSourceFunc)gtk_main_quit, NULL); + gtk_main (); +#endif + + gtk_layout_manager_measure (layout, + parent, + GTK_ORIENTATION_HORIZONTAL, + -1, + &minimum, + &natural, + NULL, + NULL); + + g_assert (minimum == 10 + 20 + 30); + g_assert (natural == 20 + 30 + 40); + + gtk_layout_manager_measure (layout, + parent, + GTK_ORIENTATION_VERTICAL, + -1, + &minimum, + &natural, + NULL, + NULL); + + g_assert (minimum == 30); + g_assert (natural == 40); + + gtk_layout_manager_allocate (layout, parent, 90, 40, 0); + + g_assert (child1->width == 20); + g_assert (child2->width == 30); + g_assert (child3->width == 40); + + g_assert (child1->height == 40); + g_assert (child2->height == 40); + g_assert (child3->height == 40); + + gtk_widget_unparent (GTK_WIDGET (child1)); + gtk_widget_unparent (GTK_WIDGET (child2)); + gtk_widget_unparent (GTK_WIDGET (child3)); + + gtk_widget_destroy (parent); +} + +/* same as the previous test, with a column + */ +static void +test_simple_column (void) +{ + GtkWidget *window; + GtkWidget *parent; + GtkLayoutManager *layout; + GtkGizmo *child1; + GtkGizmo *child2; + GtkGizmo *child3; + GtkLayoutChild *lc; + int minimum, natural; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + parent = g_object_new (GTK_TYPE_GIZMO, NULL); + gtk_container_add (GTK_CONTAINER (window), parent); + + layout = gtk_grid_layout_new (); + gtk_widget_set_layout_manager (parent, layout); + + child1 = g_object_new (GTK_TYPE_GIZMO, NULL); + child2 = g_object_new (GTK_TYPE_GIZMO, NULL); + child3 = g_object_new (GTK_TYPE_GIZMO, NULL); + + child1->name = "child1"; + child1->min_width = 10; + child1->min_height = 10; + child1->nat_width = 20; + child1->nat_height = 20; + child2->name = "child2"; + child2->min_width = 20; + child2->min_height = 20; + child2->nat_width = 30; + child2->nat_height = 30; + child3->name = "child3"; + child3->min_width = 30; + child3->min_height = 30; + child3->nat_width = 40; + child3->nat_height = 40; + + gtk_widget_set_parent (GTK_WIDGET (child1), parent); + gtk_widget_set_parent (GTK_WIDGET (child2), parent); + gtk_widget_set_parent (GTK_WIDGET (child3), parent); + + lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child1)); + gtk_grid_layout_child_set_top_attach (GTK_GRID_LAYOUT_CHILD (lc), 0); + lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child2)); + gtk_grid_layout_child_set_top_attach (GTK_GRID_LAYOUT_CHILD (lc), 1); + lc = gtk_layout_manager_get_layout_child (layout, GTK_WIDGET (child3)); + gtk_grid_layout_child_set_top_attach (GTK_GRID_LAYOUT_CHILD (lc), 2); + +#if 0 + gtk_widget_show (window); + + g_timeout_add (1000, (GSourceFunc)gtk_main_quit, NULL); + gtk_main (); +#endif + + gtk_layout_manager_measure (layout, + parent, + GTK_ORIENTATION_HORIZONTAL, + -1, + &minimum, + &natural, + NULL, + NULL); + + g_assert (minimum == 30); + g_assert (natural == 40); + + gtk_layout_manager_measure (layout, + parent, + GTK_ORIENTATION_VERTICAL, + -1, + &minimum, + &natural, + NULL, + NULL); + + g_assert (minimum == 10 + 20 + 30); + g_assert (natural == 20 + 30 + 40); + + gtk_layout_manager_allocate (layout, parent, 40, 90, 0); + + g_assert (child1->width == 40); + g_assert (child2->width == 40); + g_assert (child3->width == 40); + + g_assert (child1->height == 20); + g_assert (child2->height == 30); + g_assert (child3->height == 40); + + gtk_widget_unparent (GTK_WIDGET (child1)); + gtk_widget_unparent (GTK_WIDGET (child2)); + gtk_widget_unparent (GTK_WIDGET (child3)); + + gtk_widget_destroy (parent); +} + +int +main (int argc, + char *argv[]) +{ + gtk_test_init (&argc, &argv); + + g_test_add_func ("/grid-layout/row", test_simple_row); + g_test_add_func ("/grid-layout/column", test_simple_column); + + + return g_test_run(); +} diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build index 88016781ed..afa5c3c7dd 100644 --- a/testsuite/gtk/meson.build +++ b/testsuite/gtk/meson.build @@ -28,6 +28,7 @@ tests = [ ['focus'], ['gestures'], ['grid'], + ['grid-layout'], ['gtkmenu'], ['icontheme'], ['keyhash', ['../../gtk/gtkkeyhash.c', gtkresources, '../../gtk/gtkprivate.c'], gtk_cargs], -- 2.30.2